package db_operations;

import java.sql.SQLException;

import Beans.Professionista;
import Beans.Sede;
import Beans.TipoProfessionista;


public interface GestioneProfessionisti {
	
//AGGIORNAMENTI
	
	/**
	 * inserisce un Professionista nel DB
	 * @param Professionista: il Professionista da inserire
	 * @throws SQLException
	 */
	public void aggiungiProfessionista(Professionista p) throws SQLException;
	
	
	/**
	 * modifica Professionista
	 * @param Professionista p
	 * @throws SQLException
	 */
	public void modificaProfessionista(Professionista p) throws SQLException;
	
	
	/**
	 * elimina un Professionista dal DB
	 * NOTA BENE: eliminazione logica: spostamento dell'entry nella tabella "deleted"
	 * @param Professionista p
	 * @throws SQLException
	 */
	public void eliminaProfessionista(Professionista p) throws SQLException;
	
	
	
	//RICERCA

	/**
	 * restituisce il Professionista con l'id specificato
	 * @param int id
	 * @throws SQLException
	 */
	public Professionista getProfessionista(int id) throws SQLException;
	
	
	/**
	 * restituisce la lista di tutti i Professionisti presenti nel DB
	 * @return Professionista[]
	 * @throws SQLException
	 */
	public Professionista[] getListaProfessionisti() throws SQLException;
	
	
	/**
	 * restituisce un Professionista nella lista deleted, se presente
	 * @param id
	 * @return Professionista
	 * @throws SQLException
	 */
	public Professionista getProfessionistaDeleted(int id) throws SQLException;
	
	
	/**
	 * restituisce la lista di tutti i Professionista eliminati
	 * @return Professionista[]
	 * @throws SQLException
	 */
	public Professionista[] getListaProfessionistiDeleted() throws SQLException;
	
	
	/**
	 * ricerca Professionista su diversi parametri.
	 * NOTA: le locazioni degli array nomiParametri e valoriParametri devono essere 
	 * 		correlate: se nomiParametri[i] contiene "Nazione", 
	 * 					valoriParamentri[i] contiene il nome della nazione.
	 * @param nomiParametri: contiene la lista dei nomi degli attributi sui quali
	 * 			effettuare la ricerca. Ad esempio "Nazione", "Città" ecc..
	 * @param valoriParametri: contiene la lista dei valori degli attributi sui quali
	 * 			effettuare la ricerca. Ad esempio "Italia", "Milano" ecc...
	 * @return Professionista[]
	 * @throws SQLException
	 */
	public Professionista[] ricercaProfessionista(String[] nomiParametri, String[] valoriParametri) throws SQLException;
	
	
	/**
	 * ricerca Professionista su diversi parametri. Da utilizzare se i parametri non sono tutti stringhe.
	 * NOTA: le locazioni degli array nomiParametri e valoriParametri devono essere 
	 * 		correlate: se nomiParametri[i] contiene "Nazione", 
	 * 					valoriParamentri[i] contiene il nome della nazione.
	 * @param nomiParametri: contiene la lista dei nomi degli attributi sui quali
	 * 			effettuare la ricerca. Ad esempio "Nazione", "Città" ecc..
	 * @param valoriParametri: contiene la lista dei valori degli attributi sui quali
	 * 			effettuare la ricerca. Ad esempio "Italia", "Milano" ecc...
	 * @param tipiParametri: array contenente nomi di tipo: se tipiParametri[i] è "int"
	 * 			allora nomiParametri[i] sarà di tipo int.
	 * @return Professionista[]
	 * @throws SQLException
	 */
	public Professionista[] ricercaProfessionista(String[] nomiParametri, String[] tipiParametri, String[] valoriParametri) throws SQLException;
	
	
	/**
	 * ricerca Professionista su singolo attributo
	 * @param parametro
	 * @param valore
	 * @return Professionista[]
	 * @throws SQLException
	 */
	public Professionista[] ricercaProfessionista(String parametro, String valore) throws SQLException;
	
	
	/**
	 * ricerca i Professionisti di un determinato tipo
	 * @param TipoProfessionista tipo
	 * @return Professionista[]
	 * @throws SQLException
	 */
	public Professionista[] ricercaProfessionistaPerTipo(TipoProfessionista tipo) throws SQLException;
	
	
	/**
	 * ricerca i Professionisti per nazione
	 * @param String nazione
	 * @return Professionista[]
	 * @throws SQLException
	 */
	public Professionista[] ricercaProfessionistaPerNazione(String nazione) throws SQLException;
	
	
	/**
	 * ricerca i Professionisti per regione
	 * @param String regione
	 * @return Professionista[]
	 * @throws SQLException
	 */
	public Professionista[] ricercaProfessionistaPerRegione(String regione) throws SQLException;
	
	
	/**
	 * ricerca i Professionisti per città
	 * @param String citta
	 * @return Professionista[]
	 * @throws SQLException
	 */
	public Professionista[] ricercaProfessionistaPerCitta(String citta) throws SQLException;
	
	
	/**
	 * ricerca i Professionisti per città
	 * @param String cap
	 * @return Professionista[]
	 * @throws SQLException
	 */
	public Professionista[] ricercaProfessionistaPerCAP(String cap) throws SQLException;
	
	
	
	/**
	 * ricerca i Professionisti per provincia
	 * @param String provincia
	 * @return Professionista[]
	 * @throws SQLException
	 */
	public Professionista[] ricercaProfessionistaPerProvincia(String provincia) throws SQLException;
	
	
	/**
	 * restituisce la sede di un determinato Professionista
	 * @param Professionista p
	 * @return Sede
	 * @throws SQLException
	 */
	public Sede getSedeProfessionista(Professionista p) throws SQLException;
	
	
	/**
	 * restituisce la sede di un determinato Professionista
	 * @param int idProfessionista
	 * @return Sede
	 * @throws SQLException
	 */
	public Sede getSedeProfessionista(int idProfessionista) throws SQLException;
	
	
	
	/**
	 * restituisce tutte le sedi di tutti i Professionisti
	 * @return Sede[]
	 * @throws SQLException
	 */
	public Sede[] getSedi() throws SQLException;
	
	
	/**
	 * aggiunge una sede per il professionista
	 * @param s
	 * @throws SQLException
	 */
	public void aggiungiSede(Sede s) throws SQLException;

}
